package com.c2b.algorithm.leetcode.base;

/**
 * <a href="https://leetcode.cn/problems/remove-element/?envType=study-plan-v2&envId=top-interview-150">移除元素(Remove Element)</a>
 * <p>给你一个数组nums和一个值val，你需要原地移除所有数值等于val的元素，并返回移除后数组的新长度。
 *
 * @author c2b
 * @since 2022/5/19 10:46
 */
public class LC0027RemoveElement_S {

    /**
     * 双指针
     *
     * @param nums 数组nums
     * @param val  值val
     * @return int 移除元素后数组的长度
     * @author c2b
     * @since  2022/5/19 10:48
     */
    public int removeElement(int[] nums, int val) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            if (nums[left] != val) {
                // 如果不是目标值,左指针右移即可
                left++;
            } else {
                // 如果是目标值,左指针不动,交换左右指针的值,右指针左移
                swap(nums, left, right--);
            }
        }
        return right + 1;
    }

    private void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }

    public static void main(String[] args) {
        System.out.println(new LC0027RemoveElement_S().removeElement(new int[]{3, 3, 4, 3, 3}, 3));
    }
}
